Защитить mpq (а карта это тот-же mpq с минимумом отличий) так чтобы его не мог понять никто можно, беда в том, что тогда его не поймет и сам варкрафт. Большинство простых mpq редакторов испоьлзуют ту-же библиотеку для работы с MPQ что и сам варкрафт, что это значит, думаю, догадаться не сложно.
В целом ты прав, что текстура не должна много весить, но это необязательно. К тому же конкретно трудно выбрать лучший вариант, может быть сильное сжатие больше напрягает процессор, а потеря качества будет заметна в игре. Но определённо любая текстура в игре не должна быть размером больше 512х512, большего размера будут лишь терять в качестве при отображении, при этом для моделей оптимальным будет размер 256х256, так как 512х512 используется в основном для интерфейса и загрузочных экранов, то есть при максимально необходимой детализации. Размеры текстуры должны быть степенью двойки: 512\256\128\64\32\16\8\4\2, чтобы игра не вылетала, если настройки графики не максимальные, а такое бывает при установке игры по умолчанию, либо после переустановки винды. При сохранении в BLP Laboratory нужно выбирать blp1, так как blp2 вроде предназначен для WoW и может не отображаться в варике, при этом опыт привёл меня к заключению, что лучше сохранять текстуры с качеством 75%, а не 80%, так как это заметно делает размер меньше, но почти никогда не заметить потери качества. Но это не оптимальный вариант, однажды встречал текстуру отличного качества и меньшего размера, которая занимала больше места и явно теряло качество, когда сохранял её со своими параметрами, не смог понять, как это сделали.
Нашёл решение для тебя.
Пол-ночи провозился, но нашёл. почему-то это стало делом чести - открыть сию карту в редакторе
В общем, берёшь архив из аттача и тупо суёшь папку UI в корень варкрафта. После этого карта будет открываться любым вариантом редактора - как JNGP (любым), так и (даже!) стандартным.
Важно: локальные файлы должны быть разрешены.
Только там такой срач и дичь, что лучше реально своими руками с нуля писать...
карта "защищена"
простыми способами нельзя переводить и вообще в редакторе открывать, в теории можно в редакторе открыть, но нужен полный листфайл, который надо часами/днями восстанавливать специальной утилитой (а судя по тому что там сотни неизвестных файлов, на это уйдет очень много времени)
Ну и конечно есть ещё вариант - это редактирование scripts\war3map.j и war3map.wts
Первый это скрипт карты, через поиск " можно найти все строки
Второй это хранилище строк НО
Ещё придется редактировать объектные файлы: w3a, w3u, w3t и т.д., полный список есть в статьях по форматам данных
А если в редакторе карту не открыть без последствий - то придется пересаживать эти объектные файлы в другую карту (вместе с war3map.wts, т.к в объектных файлах могут ссылки на строки), там всё перевести и перекинуть обратно в исходник
8gabriel8, ни разу не сталкивался с вылетами редактора при длительной работе. Как я считаю, Reforged переписал пути к WC3 в регистре, из-за чего старый редактор перестал работать, но это лишь догадка.
Может, все дело в переменных? Попробуй в настройках поставить галочку копировать переменные вместе с триггерами или, если не сработает для твоего глючного редактора, попробуй скопировать переменные вручную перед триггерами.
Попробуйте перезагрузить компьютер, при загрузке компьютера нажать F8, чтобы вызвать меню выбора режимов загрузки ОС и выбрать "Загрузка последней удачной конфигурации (с работоспособными параметрами)". У меня сегодня тоже редактор стал вылетать при сохранении нестандартных объектов. Помогла перезагрузка с "загрузкой последней удачной конфигурации (с работоспособными параметрами)".
Потыкав разные кнопки во время F8 и ничего не нашёл. Там можно выбрать два пункта, которые просто загружают комп. К слову, windows 10
Да ладна, всё забейте. Как всегда, всё решилось само собой и методом тыка
Вряд ли дело в ваших текстурах, скорее всего такова механика отображения миникарты. Но есть как минимум два способа заменить миникарту заранее заготовленным изображением: импорт файла war3mapMap.blp или новая функция BlzChangeMinimapTerrainTex (только для 1.31+).
Если у юнита есть способность рудника, то иконку не скрыть через РО. Есть функция альтернативной иконки на мини-карте. Она может быть только одна в карте. Импортируешь иконку с альфа-каналом (прозрачную):
SetAltMinimapIcon("war3mapImported\\InvisibleIcon.blp") -- .dds не видит
UnitSetUsesAltIcon(unit, true) -- принимает только созданного на карте юнита, не айди юнита из РО
-- всех юнитов можно перебрать через счетчик, например
Есть еще несколько баг репортов от игроков на форуме близзов о том, что этот параметр в РО не работает на версиях 1.32+:
способность никак
вместо способности должна быть покупка юнита
при покупке юнита смотрим владельца купленного юнита
это и будет игрок нажавший на иконку
после этого выбираем таверну и удаляем купленного юнита
Смотря что нужно, если ЛКМ нужно отслеживать только для выбора юнитов, указания цели способностей или установки точки сбора, то и стандартные функции 1.26 сгодятся, а если ещё и просто сам факт щёлкания в пустоту, то либо мемхак, либо новый патч. как уже заметили выше
Происходящее здесь напомнило мне один случай из моего далекого прошлого. В те времена я еще только начинал осваивать редактор. Одна из тем, которая меня заинтересовала и по которой мне не удалось найти достаточно полной информации - утечки. Тогда я пошел на один форум и задал простой вопрос о том, как определить наличие и степень серьезности утечек в карте, не перебирая весь код. В результате я получил тонну флуда и "ответ от профи", с которым все в итоге согласились - фрагмент кода с ценным указанием "если это число растет быстро - утечек много, если медленно - мало или нет вовсе". Код представлял из себя таймер с малым периодом, который создавал объект, брал его хендл, писал в чат и удалял объект, но был один нюанс - создаваемый объект утекал на каждой итерации таймера.
У тебя ошибка, фукнкцию которую ты хочешь вызвать должна находится выше места вызова.
Unholy_Shield_End должна быть описана выше чем Sosdanie_Shita_Act1
Ну и вовсе, тебе нужен не хендл ид юнита а таймера,ибо сохранять ты данные должен на таймер а не на юнита, когда таймер истечет и вызовет функцию, внутри этой функции у тебя будет работать функция GetExpiredTimer() - которая вернет тот таймер, который запустил эту функцию, это единственный обьект связывающий твой триггер и функцию Unholy_Shield_End, и разумеется GetTriggerUnit() - не будет работать в потоке таймера, т.к это функция реакция на событие триггера. Ты походу копипастишь код совершенно не вникая в принципы его работы.
Ну если у тебя через локалку что-то неправильно иногда работает, значит просто у тебя где-то ошибка (или ты вообще делаешь это не так).
Для того что бы работать парой таймер+юнит впринципе то больше ничего и не нужно - таймер и сам юнит. Но если у тебя должно запускаться параллельно несколько точно таких же таймеров, то тут может подойти массив таймеров (и массив юнитов). При срабатывании одного из таймеров ты можешь ссылаться на юнита записанного под тем же индексом массива ( unit[X] и timer[X] соответственно).
А ещё в триггер можно добавлять события на срабатывания новых таймеров.
Это баг варика. Когда ты используешь несколько диалогов и показываешь их подряд, название Title надо каждый раз заново создавать. Если бы у тебя был один диалог и ты бы его показывал несколько раз подряд - заголовок сохраниться.
Могу посоветовать при пересоздании запускать триггер dialog повторно.
Постоянный харас хумана. Для начала проверить, есть ли у него экспанд. Если он собирается его основать - пытаться всячески сносить. Пытаться мешать крипингу (создавать скелетов жезлом, убивать побитых пехотинцев, ополчение коилом). Если хуману все же удалось построить экспанд, необходимо переходить в постоянную осаду, которая поддерживается с помощью пауков. Быстрый подъем до Т2 (Чертоги мертвых), после чего строится бойня и Лич, как второй герой (ДК - первый герой, кстати). При осаде стараться убить как можно больше пехотинцев. От экспанда лучше не отступать, так как хуман должен нести постоянные потери. При возможности убивать героя (но не сильно акцентировать на нем внимание; коил + нова, если герой хумана додыхает). Постоянно поттягивать статуи к экспанду и перебираться та Т3 (Темная Цитадель), после чего провести улучшения для сфинксов. Так как хуманы любят башни, необходимо статуи превратить в сфинксов и вынести ему башни (причем нужно каждого превратить отдельно и из следующей статуи вытащить всю ману; делать поочередно, не торопясь). Сплеш от ударов сфинксов снесет всех рабочих, которые попытаются реанимировать башни. После такого для хуманов игра завершается поражением. Главное все сделать правильно и последовательно.
Про выключение ручных сейвов ничего не могу сказать, а второй пункт решается созданием кастомного меню выхода через диалог, где ты сохраняешь игру через код. Только продолжать надо будет всё равно через загрузку игры.
мультиборд в карте на ГУИ? в гуи функциях внутри часто необнуляются локальные переменные объектов
если код то мб не используется MultiboardReleaseItem и итемы остаются висеть
а) Создай 2 переменные-массива по типу "боевая единица" (массив - чтобы для каждого игрока, мы ведь за мультиплеер трем, прально?), назови типа MyChampion и MyChampionDummy.
б) подготовь невидимого героя-пустышку с нужной тебе иконкой, убери ману, если у чемпиона ее нет. Убери ему радиус обзора, убери галочки типа "отмечать на мини-карте" - остальные - опционально.
В дальнейшем мы будем синхронизировать пустышку и реального чемпиона, создавая видимость одной боевой единицы.
Итак, наш первый триггер:
в) Отследи первое появление чемпиона, когда это случится - создай для игрока героя-пустышку. Соответственно сделай MyChampion [number of (Owner of trained unit)]= last trained unit, следующей строчкой создай того самого героя-пустышку для (owner of trained unit) и сделай MyChampionDummy = last created unit. Теперь мы прочно связали этих чуваков. Этот же триггер запускает остальные.
г) Отслеживание здоровья. Сделай изначально выключенный цикличный триггер, там, каждые 0.3 секунды. Триггер запускается пунктом в). Каждые 0.3 секунды меняй здоровье героя (чья икона висит, надо чтобы она соответствовала, прально?) в % на здоровье самого чемпиона.
д) пропищи событие, мол, если выбирает игрок своего героя (кликая на иконку) выбирается чемпион
е) убивай героя вместе с чемпионом
ж) отключай триггеры с проверкой и выбором, пока чемпион мертв
з) не забывай обновлять переменную чемпиона с каждым новым чемпионом.
xgm.guru/p/wc3/articles Попробуй сделать что-нибудь сам. Посмотри, что вообще там можно сделать. Если ты просишь сделать за тебе двухстрочный триггер - забей.
должен сразу предупредить что делать за тебя никто не будет
теперь по твоим вопросам
чтобы нельзя было кликать скрываешь, даёшь москиты, делаешь видимым
действие проиграть звук и указываешь твою фразу
выбираем всех подходящих(враги,живые) юнитов в радиусе от точки каста и создаём по дамми юниту(юнит без модели, без атаки, с москитами, с нужной способность, время жизни юнита 1 сек) для каждого подходящего юнита приказывая дамми юниту применить нужную способность в подходящего юнита
таким образом каждый дамми юнит применит нужную способность (в твоём случае корни) в 1 подходящего юнита для которого он и был создан а потом исчезнет
function IsUnitBack takes unit uF, unit uWhichBack returns boolean
real r1 = bj_RADTODEG * Atan2(GetUnitY(uWhichBack) - GetUnitY(uF), GetUnitX(uWhichBack) - GetUnitX(uF)) + 360.
real r2 = GetUnitFacing(uWhichBack) + 360.
if GetUnitY(uWhichBack) < GetUnitY(uF) then
set r1 = r1 + 360.
endif
return (r1<=(r2+45.) and r1>=(r2-45.))
endfunction
Юзать структуры, свои собственные системы хранения данных.
Если вы только решили слезть с гуи+ вейты на jass, то вам рано думать о таком.
Таймер + хештаблицы в помощь, в статьях есть много информации на эту тему.
Что вам еще непонятно? ImbaStyle, что есть TriggerSleepActions и timer вам известно?
Нельзя просто использовать таймер вместо вейта посередине триггера (гуишный вейт именно так и работает - запускает таймер и проверяет циклом каждые 0.1 сек пока он не пройдет).
Но если так уж нужно узнать истек ли таймер:
Real comparison - Обратный отсчет - Remaining time for timer (оставшееся время таймера)
Уже давно забыл что такое варкрафт и как выглядят тригерры но попробую объяснить по кривому)
Через событие юнит атакован выставляй шанс на то что даммик бафнет героя дамми бафом который даёт лайф стил и атак спид...
Как-то так)
Более подробно и правильно объяснить не смогу т.к ничерта не помню)
Неуязвимость проверяют через даммика с атакой, через приказ, сможет ли атаковать или нет, просто проверка выполнения приказа. Так же пытаются нанести урон и смотрят сколько он отнял здоровья, так можно и определить неуязвимость и вычислить резист юнита к конкретному типу урона.
Так ведь в редакторе объектов есть строчка "Пути - требование к расположению". Там можно просто поставить галочку "Неиспорченный" и построить это здание на порченной земле будет уже нельзя.
Эмм что за ерунда, сократил код, убрав всё лишнее, но утечки все равно остаются, по 1.5 - 2 хэндла за каждое нанесение урона (тип хэндла не знаю как посмотреть). Когда триггер отключаешь, то всё нормально.
Сокращенный код
function SDMSCreateTextTag takes nothing returns nothing
local unit u=GetTriggerUnit()
local unit s=GetEventDamageSource()
local integer i=GetConvertedPlayerId(GetOwningPlayer(u))
local texttag tt=CreateTextTag()
local real dmg=GetEventDamage()
if ( dmg > 1.00 ) and ( dmg < 9999.00 ) then
if GetPlayerId(GetOwningPlayer(u))==12 then
call SetTextTagText(tt, "|cff9db9eb-"+I2S(R2I(dmg))+"|r", 0.023)
else
call SetTextTagText(tt, "|cffffa500-"+I2S(R2I(dmg))+"|r", 0.023)
endif
call SetTextTagPosUnit(tt, u, 0)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagVelocity(tt, 0.05325*Cos(90 * bj_DEGTORAD), 0.05325*Sin(90 * bj_DEGTORAD))
call SetTextTagPermanent(tt, false)
call SetTextTagLifespan(tt, 1.0)
call SetTextTagFadepoint(tt, 0.0)
endif
call PolledWait(2.0)
call DestroyTextTag(tt)
set u=null
set s=null
set i=0
set dmg=0
set tt=null
endfunction
function SDMSTriggerRegisterUnitDamaged takes nothing returns nothing
call TriggerRegisterUnitEvent(udg_SDMStrigger,GetEnteringUnit(),EVENT_UNIT_DAMAGED)
endfunction
function theSDMSTriggerActions takes nothing returns nothing
local trigger UnitEnter=CreateTrigger()
call TriggerRegisterEnterRectSimple(UnitEnter, gg_rct_Arena)
call TriggerAddAction(UnitEnter,function SDMSTriggerRegisterUnitDamaged)
set UnitEnter=null
endfunction
function InitTrig_the_SDMS_Trigger takes nothing returns nothing
local trigger tr=CreateTrigger()
set udg_SDMStrigger=CreateTrigger()//Тут также меняется название глобальной переменной типа триггер.
call TriggerAddAction(udg_SDMStrigger,function SDMSCreateTextTag)
call TriggerRegisterTimerEventSingle(tr,0.0)
call TriggerAddAction(tr,function theSDMSTriggerActions)
set tr=null
endfunction
Wait вызывает утечки ((
Пришлось делать через таймер
сделать базу даных по названию...
строка[1] = "пехотинец"
строка[2] = "паладин"
тип юнита[1] = пехотинец
тип юнита[2] = паладин
цыкл
если введенная строка == строка[А]
создать юнита тип юнита[А]
Это конкретно по ошибке... а вообще - не надо смотреть видео от этого человека, он тебя плохому научит... правда. А другим потом придётся тебя переучивать, если ты сам это дело не забросишь
Значит 3 раза понижали. Опыт может снятся только в одном из этих случаев:
ресурс снят с публикации который ранее был опубликован
проект снижен в уровне, который ранее был большего уровня
удален опубликованный комментарий / пост на форуме
ты написал сообщение в оффтопку на форуме (за каждый пост -1 опыта)
ну и самый редкий вариант ,если какой то модератор пользуюсь служебным положением заабузит админку и начислит н-ое кол-во опыта определенному юзера, мы это спалим и снимем опыт назад.
Значит 3 раза понижали. Опыт может снятся только в одном из этих случаев:
ресурс снят с публикации который ранее был опубликован
проект снижен в уровне, который ранее был большего уровня
удален опубликованный комментарий / пост на форуме
ты написал сообщение в оффтопку на форуме (за каждый пост -1 опыта)
ну и самый редкий вариант ,если какой то модератор пользуюсь служебным положением заабузит админку и начислит н-ое кол-во опыта определенному юзера, мы это спалим и снимем опыт назад.
Уровень = Уровню героя. Характеристики = Характеристикам героя. Цикл 6-разовый на каждый слот дающий предмет герою. Уровни способностей равные уровню способностей героя. Героя, в смысле твоего героя. Ну еще создать юнита типа твоего героя. Что-то еще? Если он где-то в переменных для пассивок, то с ними тоже по колдовать и все.
Будет только одна проблема, если ты книги атаки на его юзал то их никак не засеч без геморроя. А так все в виде целочисленных на твоем герое записано.
» WarCraft 3 / MPQ Master как использовать?
» WarCraft 3 / Карта не открывается
» WarCraft 3 / World Editor Reforged
» Администрация XGM / Почему я могу редактировать чужой комментарий?
» WarCraft 3 / вылетает карта кампании
» WarCraft 3 / Вопрос по загрузочному экрану
» WarCraft 3 / Миникарта
» IrInA Host Bot / Проблема вылетов из карты
» WarCraft 3 / Как создать невидимую способность?
» WarCraft 3 / Отследить ЛКМ
» WarCraft 3 / Таймер
» WarCraft 3 / Помощь в начале.
» WarCraft 3 / Нужна помощь с триггером
» WarCraft 3 / Блок атаки
» WarCraft 3 / Работает ли GetItemTypeId
» WarCraft 3 / Таймер вместо вейта
» WarCraft 3 / Контратака
» WarCraft 3 / Отлов точки приказа постройки
» WarCraft 3 / Строка и переменная тип юнита
» WarCraft 3 / Команда для игрока
» WarCraft 3 / Редактирование текстур
» Администрация XGM / как получить уровень 1
» Администрация XGM / как получить мне уровень в этом сайте
» WarCraft 3 / Собственные характеристики для героя